#include "ManejadorPatricia.h"

ManejadorPatricia::ManejadorPatricia(){
	this->arbolPatricia = new tArbolPatricia();
	this->infoTerminosIndexados = new Lista<InfoTerminoIndexado*>();
}

tArbolPatricia* ManejadorPatricia::getArbolPatricia(){
	return this->arbolPatricia;
}

tIdTermino ManejadorPatricia::crearIdTermino(tClavePatricia termino) const{
	//codifico el termino de acuerdo a las posiciones de sus caracteres en la palabra
	size_t size = termino.size();
	//para acumular los pesos de cada letra de la palabra
	int codigoParcial = 0;
	for(size_t i=0 ; i < size ; i++){
		codigoParcial = codigoParcial + i*(size_t)termino[i];
	}
	return codigoParcial;
}

Lista<InfoTerminoIndexado*>* ManejadorPatricia::getInfoTerminosIndexados(){
	return this->infoTerminosIndexados;
}

void ManejadorPatricia::actualizar(tClavePatricia termino, tIdDoc IdDoc){

	tIdTermino IdTermino_creado = this->crearIdTermino(termino);

	IteradorLista<InfoTerminoIndexado*> itInfoTerminos = this->infoTerminosIndexados->iterador();
	bool existeTermino = this->arbolPatricia->Exists(termino);
	bool salir = false;
	//se pregunta primero la existencia de el termino en el arbol patricia!
	while (existeTermino && itInfoTerminos.tieneSiguiente() && !salir){
		InfoTerminoIndexado* infoTermino_actual = itInfoTerminos.siguiente();
		tIdTermino idTermino_actual = infoTermino_actual->getIdTermino();
		if ( idTermino_actual == IdTermino_creado){
			infoTermino_actual->actualizar(IdDoc);
			salir = true;
		}
	}

	if (!existeTermino){
		this->arbolPatricia->Insert(termino, IdTermino_creado);
		InfoTerminoIndexado* infoTermino = new InfoTerminoIndexado(IdTermino_creado, IdDoc);
		this->infoTerminosIndexados->agregar(infoTermino);
	}
}

bool ManejadorPatricia::eliminarTermino(tClavePatricia termino){

//	tIdTermino IdTermino_creado = this->crearIdTermino(termino);

	bool seEliminoTermino = this->arbolPatricia->Delete(termino);

	if (seEliminoTermino){
		IteradorLista<InfoTerminoIndexado*> itInfo_deTerminosIndexados = this->infoTerminosIndexados->iterador();
		while (itInfo_deTerminosIndexados.tieneSiguiente()){
			InfoTerminoIndexado* infoTermino_actual = itInfo_deTerminosIndexados.remover();
			IteradorLista<Frecuencia_por_IdDoc*> itFrec_IdDoc = infoTermino_actual->getFrecuencias_por_IdDoc()->iterador();
			while (itFrec_IdDoc.tieneSiguiente()){
				Frecuencia_por_IdDoc* fre_IdDoc_actual = itFrec_IdDoc.remover();
				delete fre_IdDoc_actual;
			}
			delete infoTermino_actual;
		}
	}

	return seEliminoTermino;
}

ManejadorPatricia::~ManejadorPatricia(){
	delete this->arbolPatricia;
	delete this->infoTerminosIndexados;
}
